Rivensing, наверно чтоб от способностей уворачиваться, надо то же самое сделать, только со способностью "Невосприимчивость к магии". Только её надо не со 100% вероятность давать. Потому что она блокирует магию всегда в отличии от "Змеиной ловкости".
Дать юниту дальнего боя способность "Грозовая атака", у которой в "Эффекты молнии" установить "Магический огонь". "Вытащить эффект молнии" даст текстуру вроде бы, а анимация снаряда делается моделью.
Импортируй модели в карту, удали везде "war3mapImported\" и будет тебе счастье
Везде это и в блп и в мдх?
Действительно есть подробные статьи про импорт, мог бы почитать, но раз ты все же завел тему:
Модели (.mdx/.mdl) используют текстуры. Нестандартные модели часто используют текстуры, которых нет в стандартном варе и они идут (как правило) вместе с моделью. Соответственно, при импорте, необходимо указать путь текстуры такой же, какой ищет модель.
Чтобы узнать, как путь тектуры нужен, можно использовать прогу MDXPather (тогда ты его еще и изменить сможешь на желаемый) или просто открыть модель блокнотом (да, так можно). Пути текстур ты найдешь в первых 5-10 строках.
Для верности, копируешь их ЦЕЛИКОМ и заменяешь ЦЕЛИКОМ поле вида 'war3imported/x.blp'. В некоторых случаях перезапускаешь WorldEditor. У меня и без перезапуска они начинают работать.
У моделей 'war3imported' можно не удалять, хотя бывают и исключения.
Способ есть.
Но для этого нужен Warcraft 3 и редактор.
Итого:
открываешь редактор,
открываешь в нем карту
клацаем F9 или просто Проверку карты (там иконка самая последняя в строчке, красная галочка)
Profit...
Внимание! Не все карты так можно открыть, некоторые защищенные и открытию в редакторе не подлежат, а если их восстановить, то они не всегда работоспособны.
ты бы названий таких не делал, а то модератор впаяет условку
для открытия обычных карт понадобится стандартный World Editor, идущий в комплекте с игрой
карты кампании нужно искать в архивах *.mpq, которые находятся в директории игры, в одной папке с приложением war3.exe, и для их открытия понадобятся программы наподобие Win mpq или War3ModelEditor со встроенным Mpq Browser
Можно, War#mapResorer в помощь, вот ссылочка А что именно интересует, я кое какие скиллы выкладывал, у фрога там черт ногу сломит, какие то недогуи, всякие старые скиллы которые не удалены, ужос, карта открывается в редакторе по 5 мин.
Ой, лучше не так. Это для каждого героя надо будет прописывать в Инициализации.
Лучше, например:
С: Юнит входит в игровую карту
У: Юнит равно Герой равно Да
Д: Что на скрине действие, только вместо конкретного типа юнита указываешь unit-type of (Triggering unit) и ставишь 0
Если надо для всех игроков запретить в таверне этого героя, то выбираешь группу игроков и переносишь туда это действие, а в нём меняешь Игрок 1 (красный) на (Picked player).
Событие у тебя стоит первое в списке категории Боевая единица, поставь третье Приводит способность в действие, а в условии добавь Unit-type comparsion, (Casting unit) равно ТВОЙ_ГЕРОЙ.
В первом поле "Маг" делаем значение "пусто", чтобы не было стрелочки над героем. Минус в том, что будет не видно героя, который будет приобретать предмет.
Во втором поле устанавливаем значение (расстояние взаимодействия таверны с героем)
Extremator предлагает делать переключение через выделения таверн через триггеры. Выделение с одной снял, выделение на другую переключил.
Хоттаб, предлагаю другой вариант - ОДНУ таверну со всеми героями. пример с итемами, там переключение система 14 верс
есть пример, тоже самое можно сделать например для героев. По идее можно всех-всех героев заранее забить в таверну. Так можно сделать ОДНУ таверну со всеми героями, но с переключением списков. Так можно сделать, это надо в РО забить всех героев в таверну, если не получается пробуйте через клавишу Shift. Но будет отображаться только первые 10-12, остальные не вместятся на панеле. Поэтому надо разбить героев на списки.
Можно спрятать всех героев, кроме определенных героев, находящей на первой странице. А когда нажимаешь, то прячешь для игрока одних героев на 1 странице, и показываешь других героев на след странице.
как прятать героев вот ссылкакогда задаешь лимит обучения данного типа ноль, то иконка этого героя исчезает. прячешь одних. разблокируешь других.
Ссылку на Ютуб-канал разрешается делать в блоге. Но вот ссылки на другие сайты запрещены.
Кстати, если вас интересует, на сайте тоже есть свой канал - поэтому возможно договорится о взаиморекламе между каналами.
Это спец фильтр делает (Fanboy's Social Blocking List), его можно отключить.
AdGuard тоже можно включить фильтр, который всё это дело убирает.
Fanboy's Annoyances и Fanboy's Social Blocking List.
PT153, это лимит для одного игрока, то есть героя смогут нанять другие.
Нужно поставить таверне способность Продажа войск. Потом делаешь триггер:
Событие: Юнит вошёл в область (Вся игровая карта)
Условие: Триггеринг юнит равно Герой равно Да (можно этого не делать, просто исключает срабатывание триггера для каждого юнита)
Действия: несколько действий Если/То/Иначе
Если - Юнит тип (Триггеринг юнит) равно Какой-то Герой Из Таверны
То - Нейтральное здание - Удалить Какой-то Герой Из Таверны из таверны
Иначе - Ничего
И так для каждого типа героев в таверне.
Едва ли. Хотя...
Есть хорошее условие wait for condition, благодаря которому всё можно будет впечатать в 1 триггер без особых сложностей.
Например приказать топать в область 1
подождать пока область 1 содержт юнит
приказать что-то ещё.
Оба файла удаляются, потому что ты импортируешь их в карту через программу и не добавляешь данные о файлах в файл импорта(war3map.imp). При сохранении карты в редакторе архив пересобирается, и в него добавляются сторонние файлы, которые сохранены в том самом файле импорта. Поэтому используй стандартный менеджер импорта в редакторе.
pro100master, но ведь это собьет и его текущие приказы?
Upd.:Я понял в чем проблема.
Я хочу чтоб можно было использовать способности юнита, при этом чтоб были недоступны атака/перемещение итд., а ведь это тоже его способности...
Короче я загнал себя в угол.
Пожалуй пойду по пути создания торговца-здания.
Но если у кого есть решение моей дилемы - буду рад!
Со вторым - можно легко уменьшить хп всех юнитов одной стороны с помощью функции Set Handicap из ГУИ.
Да, я понимаю, но другой вопрос: как "дать редактору понять", что один из игроков отсутствует? Какое событие или же условие надо поставить?
Можно просто считать количество играющих игроков. В ГУИ это делается так: создаешь целочисленную переменную и приравниваешь ее значение к Number of players in (All of players matching (((Matching player) slot status) равно Играет)).
Чтобы это дело прикрутить к установке гандикапа, ты создаешь триггер с кучей событий вида Игрок 1 (красный) leaves the game, туда вставляешь эту штуку выше, и затем там же устанавливаешь гандикап.
Да, и еще, эта функция считает всех компьютерных игроков тоже как "играющих", так что на это надо сделать поправку.
Можешь триггерно давать опыт, для этого в таблице опыта ставишь 0, героев помещаешь в группу, в триггере событие юнит умирает, в условии юнит - враг, в действии в группе героев даёшь опыт.
Экстрасенсы чувствуют что ты шаришь только в GUI, так что замути абилку на основе канала с временем каста 2.33 и нужной анимацией. Она, правда, как-то хреново взаимодействует со станами - не кислотной бомбой (или че-то такое, никогда не сталкивался, пофиг), но послужит тебе верно. При спавне просто кастуй абилку.
Не берите вы эти ульты для основы своих скиллов, они сделаны через одно место лиж бы работали в капмании, а там дальше хоть потоп.
Сделайте заклинание из канала, а юнитов вокруг делайте неуязвимыми.
странно, но в любом случае, я снова дал не ту, эта именно обновляет скин - мороз, оживление, вот это всё пересчитывает. Вот функция смены модели:
function ChangeUnitModelTo takes unit u, string modelpath returns nothing
local integer a
local integer s
set LastConvertedHandle=ConvertHandle(u)
if LastConvertedHandle>0 then
set a=RMem(LastConvertedHandle)+0x88
if a>0 then
set a=RMem(a)
if a>0 then
set s=GetStringAddress(modelpath)
call CallThisCallWith3Args(a,LastConvertedHandle,s,1)
endif
endif
endif
endfunction
Ты так и не присвоил этой переменной нужное значение.
Убедись, что переменная hero_bandit имеет тип Боевая единица.
После создания, сразу используй hero_bandit[0] = (Last created unit)
Бандит надеюсь герой, а не обычный смертный ? (Иначе так ты его не воскресишь)
Прилагаю пример.
Один ресурс - один вопрос. Отвечу на второй.
Событие - Unit - A unit finishes training.
Условие - Unit-type comparison - Unit-type of Trained Units equals ТВОЙ_ТИП
Действия
Unit - Apply a life timer to Trained Unit.
Bergi_Bear, не знаю, я так понимаю, что редактор кампаний как-то по особому позволяет редактировать карту. Насколько помню, изменения карты, что вносятся через редактор кампаний, не влияют на саму карту.
Меняется - можно поставить свой бафф, что сделан на основе оригинальный. Естественно, нельзя сделать так, чтобы отравленные стрелы станили.
Стан только у баша.
Удалить дебафф в момент отлова урона. Его продолжительность не имеет в таком случае никакого значения.
В версии 1.31 можно проверить тип получаемого/наносимого урона. Урон типа NORMAL всегда идет от атаки.
Происходящее здесь напомнило мне один случай из моего далекого прошлого. В те времена я еще только начинал осваивать редактор. Одна из тем, которая меня заинтересовала и по которой мне не удалось найти достаточно полной информации - утечки. Тогда я пошел на один форум и задал простой вопрос о том, как определить наличие и степень серьезности утечек в карте, не перебирая весь код. В результате я получил тонну флуда и "ответ от профи", с которым все в итоге согласились - фрагмент кода с ценным указанием "если это число растет быстро - утечек много, если медленно - мало или нет вовсе". Код представлял из себя таймер с малым периодом, который создавал объект, брал его хендл, писал в чат и удалял объект, но был один нюанс - создаваемый объект утекал на каждой итерации таймера.
я посмотрел короче муй с помощью текста и знаете что он даже не доходит до 100) когда доходит до рандомное число от 1 до 100 примерно(могу ошибаться) он опять становится 2 так что писать таймер[от 1 до 100] вариант)
Если по игроку то массив переменных по игроку, если прям каждого конкретного героя каждого игрока - то через custom value или прочий регистратор юнитов.
Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.
Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
Аналогично ответу на этот вопрос для чистого WE, но без объявления переменных в WE т.к. то уже не так удобно становится когда код во внешнем редакторе.
Теперь о точках входа и инжекте.
Луа позволяет делать такой финт ушами
do
local f = FunctionName -- записываем функцию в переменную
function FunctionName() -- заменяем оригинальную функцию своей
f() -- вызываем оригинальную функцию из переменной
-- здесь могла быть ваша реклама или ваш код
end
end
Это позволит нам сохранить оригинальную функцию в переменную, заменить оригинал своей функцией и вызвать оригинал из переменной. Применимо к любой функции, которая была объявлена раньше, не работает если функция объявлена после выполнения этого кода. Для создания точки входа отлично подходит InitGlobals, она всегда объявляется раньше кастомного кода в WE и вызывается из main.
У себя в коде я пользуюсь немного более сложным способом, этот код не будет работать в WE т.к. цепляет main, а не InitGlobals и не дает серьеных преимуществ перед описаным выше, привожу просто для расширения кругозора
local function InjectMain()
local alpha_main = main
return function()
local alpha_init = RunInitializationTriggers
RunInitializationTriggers = function() end
alpha_main()
InitLibraries() --моя функция, которая должна быть выполнена после всего, но до триггеров инициализации карты
alpha_init()
end
end
main = InjectMain()
Каждую секунду проверяешь изменение золота у каждого игрока и заносишь в переменную. Если золота стало меньше чем указано в переменной, то установи такое количество золота у остальных игроков.
Поскольку не достаточно подробно прописаны условия вопроса - дам альтернативный ответ - поставить всех на паузу. Добыча и строительство гарантированно будут заблокированы. Правда будет заблокировано и все остальное - передвижение, нанесение и получение урона и так далее.
Сделать для каждой способности пассивную копию, где в описании указать необходимое количество золота и при изменении золота, например, изменять способности
Сделать через требование юнита. Юнита назвать, например, "10 золота" и выдавать/убирать их при изменении золота. Выглядеть это будет так:
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.
2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.
Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.
4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.
5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...
Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.
Это легко через Custom Value и переменние.
Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit s=GetEventDamageSource()
local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
local texttag tt=CreateTextTag()
local real dmg=GetEventDamage()
if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
if GetPlayerId(GetOwningPlayer(u))==12 then
call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
else
call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
endif
call SetTextTagPosUnit(tt, u, 0)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 1.0)
call SetTextTagFadepoint(tt, 0.0)
endif
call PolledWait(2.0)
call DestroyTextTag(tt)
set u=null
set s=null
set i=0
set dmg=0
set tt=null
endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function theSDMSTriggerActions takes nothing returns nothing
local trigger UnitEnter=CreateTrigger()
call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
set UnitEnter=null
endfunction
function InitTrig_the_SDMS_Trigger takes nothing returns nothing
local trigger tr=CreateTrigger()
set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
call TriggerRegisterTimerEventSingle(tr,0.0)
call TriggerAddAction(tr,function theSDMSTriggerActions)
set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
Кстати да, тоже интересно. Всегда просто удаляю второй. Я понимаю, что там скорее всего что-то несет информационную ценность, но оно бы тогда хотя бы настраивалось как-то в оптимизаторе, создавать его или не создавать и/или удалить после выполнения оптимизации, а то немного раздражает мусор руками чистить. Если такие настройки есть - подскажите плз.
Если хочешь качественную анимацию,где двери шлюза закрываются,то сделай двери гармошкой.
А лучше сделать две модели дверей шлюза.Одни двери открыты,а другие закрыты.И менять их видимости в анимах.
поставить на пузу, либо добавить способность склад, установить скорость бега 0 и заблокировать способности, так же можно просто дамиком кинуть стан в этого юнита и удалять тригерно
Можно создать плейлист, но не гуишными функциями, а написав в кастом скрипте пути к музыке через точку с запятой.
call PlayMusicBJ("war3mapImported\\haruhazazimu9.mp3;war3mapImported\\auaunanodesu.mp3;war3mapImported\\confusingmelody.mp3")
Затем используя getlocalplayer можно используя сравнение расы играть нужный плейлист для каждого.
Заменить декорацию нельзя, но можно сделать иллюзию замены.
1: Ставить декор один на другой и прятать/показывать нужный.
2: Проиграть анимацию, которая есть у модели (можно сделать кастомную модель из нескольких моделей). Если в карте декора мало, то можно для замены использовать "разрушаемые".
Советую проверять бекапы один за другим, и в том, в котором впервые возникает такая проблема, и искать ошибку, она наверняка где-то в изменениях относительно хронологически предыдущей версии.
» WarCraft 3 / Магическая атака
» WarCraft 3 / Помощь с моделью
» WarCraft 3 / как открыть карту ?
» IrInA Host Bot / БОТ
» WarCraft 3 / Таверны
» Администрация XGM / YouTUBE
» WarCraft 3 / Таверна и Герои в ней
» WarCraft 3 / Сохранение приказа
» WarCraft 3 / Золото при переходе на некст карту
» WarCraft 3 / Анимация при создании юнита
» WarCraft 3 / Редактирование приказов
» WarCraft 3 / Создание юнитов
» WarCraft 3 / Вопрос вот в чём...
» WarCraft 3 / таймер
» WarCraft 3 / Константы в jass
» WarCraft 3 / Золото?
» WarCraft 3 / Камера от 3 лица.
» WarCraft 3 / Про погодные условия
» WarCraft 3 / Оптимизация размера карты
» WarCraft 3 / Как устанавливать данную модель?
» WarCraft 3 / Определение расы
» WarCraft 3 / Как сделать прозрачность декорации?
» WarCraft 3 / Warcraft 3 вылетает.
» WarCraft 3 / Редактор моделей
» WarCraft 3 / С чего начать?